package com.abel.bigwater.data.sanchuan

import io.netty.buffer.ByteBuf

class MeterOfflineData(_dataLen: Int?) : SanchuanData(_dataLen) {
    var flag: OfflineFlagType? = null

    init {
        if (dataLen != null && FIXED_LEN != dataLen) {
            throw IllegalArgumentException("Offline应为null或者固定长度")
        }
    }

    /**
     * 计算数据长度，针对解析和打包
     */
    override fun computeDataLen(): Int {
        dataLen = FIXED_LEN
        return dataLen!!
    }

    /**
     * 从当前位置写入打包字节流
     */
    override fun fillBuffer(buf: ByteBuf) {
        buf.writeByte(flag!!.code)
    }

    /**
     * 解析字节流，从buf当前位置开始，并且消费其中的字节。
     */
    override fun <T : SanchuanData> parseBuffer(buf: ByteBuf): T? {
        flag = OfflineFlagType.findByCode(buf.readByte().toInt())

        return this as T
    }

    companion object {
        const val FIXED_LEN = 1
    }
}

/**
 * 0x00表示服务器有后续命令，水表不能下线
0x01表示水表可以直接下线
其它值待定义
 */
enum class OfflineFlagType(_code: Int) {
    CommandLeft(0),
    GameOver(1);

    val code: Int = _code

    companion object {
        fun findByCode(_code: Int): OfflineFlagType? = OfflineFlagType.values().find { it.code == _code }
    }
}